﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ConfeccionesJR.Entites;
using ConfeccionesJR.BussinesLogic;
using Microsoft.Practices.Unity;

namespace ConfeccionesJR.UI
{
    public partial class frmMttoCompra : Form
    {
        [Dependency]
        public IProveedorBL proveedorBL { get; set; }

        [Dependency]
        public IMaterialBL materialBL { get; set; }

        [Dependency]
        public ICompraBL compraBL { get; set; }

        [Dependency]
        public IDetalleCompraBL detallecompraBL { get; set; }

        [Dependency]
        public IUnidadMedidaBL undMedidaBL { get; set; }


        bool bandera;

        public frmMttoCompra()
        {
            InitializeComponent();
            this.BuildUp();
        }

        private void frmMttoCompra_Load(object sender, EventArgs e)
        {
            lblMensaje.Visible = false;
            lblAyuda.Visible = false;

            mATERIALBindingSource.DataSource = materialBL.GetAllFromMaterial();
        }

        public void Nuevo()
        {
            bandera = true;
            cOMPRABindingSource.AddNew();
        }

        public void Editar(int id)
        {
            bandera = false;
            var _compra = compraBL.GetFromCompraById(id);
            cOMPRABindingSource.DataSource = _compra;
            _compra.PROVEEDOR = proveedorBL.GetFromProveedorById(_compra.ProveedorId);
            lblAyuda.Visible = false;
        }

        private void rucTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)// && bandera == true)
            {
                FrmProveedor frm = new FrmProveedor();
                frm.Prove = true;
                frm.ShowDialog();
                if (frm.CurrentProveedor != null)
                {
                    var _compra = cOMPRABindingSource.Current as COMPRA;
                    _compra.PROVEEDOR = frm.CurrentProveedor;
                    _compra.ProveedorId = frm.CurrentProveedor.Id;
                    cOMPRABindingSource.ResetBindings(true);
                    BtnVerificar.Enabled = false;
                }
            }
            if (e.KeyCode == Keys.Enter && rucTextBox.Text.Length > 0) //&& bandera == true
            {
                VerificarProveedor();
            }
        }

        private void rucTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab && rucTextBox.Text.Length > 0)//&& bandera == true
            {
                VerificarProveedor();
            }
        }

        private void BtnVerificar_Click(object sender, EventArgs e)
        {
            if (rucTextBox.Text.Length > 0)
            {
                VerificarProveedor();
            }
        }

        private void VerificarProveedor()
        {
            if (bandera == false)
            {
                lblAyuda.Visible = false;
            }
            var _proveedor = proveedorBL.GetFromProveedorByRuc(rucTextBox.Text);

            if (_proveedor != null)
            {
                var compra = cOMPRABindingSource.Current as COMPRA;
                compra.PROVEEDOR = _proveedor;
                compra.ProveedorId = _proveedor.Id;

                cOMPRABindingSource.ResetBindings(true);
            }
            else
            {
                MessageBox.Show("Proveedor no Registrado", "Mensaje",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void BuscarEnMateriales()
        {
            List<MATERIAL> existenMateriales;
            existenMateriales = materialBL.GetFromMaterialByDescripcion(TxtDescripcion.Text);

            if (existenMateriales.Count <= 0)
            {
                lblMensaje.Visible = true;
            }
            else
            {
                lblMensaje.Visible = false;
                mATERIALBindingSource.DataSource = existenMateriales;
            }
        }

        private void BtnBuscar_Click(object sender, EventArgs e)
        {
            BuscarEnMateriales();
        }

        private void TxtDescripcion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarEnMateriales();
            }
        }

        private void BtnBuscarproducto_Click(object sender, EventArgs e)
        {
            BuscarproductoEnDetalle();  
        }

        private void TxtproductoDesc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarproductoEnDetalle();
            }
        }

        private void BuscarproductoEnDetalle()
        {

            List<DETALLECOMPRA> listatemp = new List<DETALLECOMPRA>();
            var material = mATERIALBindingSource.Current as MATERIAL;
            var _compra = cOMPRABindingSource.Current as COMPRA;

            if (_compra != null)
            {
                if (TxtproductoDesc.Text != null && TxtproductoDesc.Text != "" && TxtproductoDesc.Text != string.Empty)
                {
                    foreach (var item in _compra.DETALLECOMPRAs)
                    {
                        var descMayus = (TxtproductoDesc.Text).ToUpper();
                        var itemPRO = (item.MATERIAL.Descripcion).ToUpper();
                        var a = itemPRO.Contains(descMayus);
                        if (a == true)
                        {
                            listatemp.Add(item);
                        }
                    }
                    dETALLECOMPRAsBindingSource.DataSource = listatemp;
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }
                else
                {
                    dETALLECOMPRAsBindingSource.DataSource = _compra.DETALLECOMPRAs;
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen materiales en la Compra", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void productoDataGridView_DoubleClick(object sender, EventArgs e)
        {
            Agregarproducto();
        }

        private void Agregarproducto()
        {
            var _material = mATERIALBindingSource.Current as MATERIAL;
            COMPRA _compra = cOMPRABindingSource.Current as COMPRA;

            if (_material != null)
            {
                var detalle = new DETALLECOMPRA
                {
                    CompraId = _compra.Id,
                    materialId = _material.Id,
                    MATERIAL= _material,
                    Cantidad = 1,
                    PrecioUnit = _material.Costo
                };

                //UndMedida.

                var existe = _compra.DETALLECOMPRAs.Where(dp => dp.materialId.Equals(_material.Id)).SingleOrDefault();

                if (existe == null)
                {
                    _compra.DETALLECOMPRAs.Add(detalle);

                    var tot = _compra.DETALLECOMPRAs.Sum(p => p.Monto);
                    _compra.Total = Math.Round(tot, 2);

                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El material : {0}," + "ya se encuentra en el pedido",
                        _material.Descripcion), "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                cOMPRABindingSource.ResetBindings(true);
                dETALLECOMPRAsBindingSource.ResetBindings(true);
            }
        }

        private void CalcularTotal()
        {
            var _compra = cOMPRABindingSource.Current as COMPRA;

            if (_compra != null)
            {
                var tot = _compra.DETALLECOMPRAs.Sum(p => p.Monto);
                _compra.Total = Math.Round(tot, 2);
                cOMPRABindingSource.ResetBindings(true);
            }
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            GuardarCompra();
        }

        private void GuardarCompra()
        {
            var _compra = cOMPRABindingSource.Current as COMPRA;
            var msg = "ERROR";
            var fechaDTP = fechaDateTimePicker.Value.Date;

            if (_compra != null)
            {
                _compra.NroGuia = nroGuiaTextBox.Text.ToUpper();
                if (bandera == true)
                {
                    try
                    {
                        var cant = 0;
                        foreach (var item in _compra.DETALLECOMPRAs)
                        {
                            if (item.Cantidad > 0 && item.PrecioUnit > 0)
                            {
                                cant++;
                            }
                            else MessageBox.Show("El precio del Material " + item.MATERIAL.Descripcion + " debe ser mayor a  0", "Mensaje",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                        if (cant == _compra.DETALLECOMPRAs.Count)
                        {
                            _compra.Fecha = fechaDTP;
                            compraBL.AddCompra(_compra);
                            //bandera = false;
                            MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                if (bandera == false)
                {
                    try
                    {
                        var cant = 0;
                        foreach (var item in _compra.DETALLECOMPRAs)
                        {
                            if (item.Cantidad > 0 && item.PrecioUnit > 0)
                            {
                                cant++;
                            }
                            else MessageBox.Show("El precio del Material " + item.MATERIAL.Descripcion + " debe ser mayor a  0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        }

                        if (cant == _compra.DETALLECOMPRAs.Count)
                        {
                            _compra.Fecha = fechaDTP;
                            compraBL.UpdateCompra(_compra);
                            Editar(_compra.Id);
                            MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }

        private void productoDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                var _material = mATERIALBindingSource.Current as MATERIAL;
                COMPRA _compra = cOMPRABindingSource.Current as COMPRA;

                if (_material != null)
                {
                    var detalle = new DETALLECOMPRA
                    {
                        CompraId = _compra.Id,
                        materialId = _material.Id,
                        MATERIAL = _material,
                        Cantidad = 1,
                        PrecioUnit = 0

                    };

                    var existe = _compra.DETALLECOMPRAs.Where(dp => dp.MATERIAL.Id.Equals(_material.Id)).SingleOrDefault();

                    if (existe == null)
                    {
                        _compra.DETALLECOMPRAs.Add(detalle);
                        var tot = _compra.DETALLECOMPRAs.Sum(p => p.Monto);
                        _compra.Total = Math.Round(tot, 2);

                    }
                    else
                    {
                        var rpt = MessageBox.Show(this, string.Format("El material : {0}," +
                            "ya se encuentra en el pedido", _material.Descripcion), "Mensaje",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);
                    }
                    cOMPRABindingSource.ResetBindings(true);
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }
            }
        }

        private void BtnNewproducto_Click(object sender, EventArgs e)
        {
            frmMttoMaterial frm = new frmMttoMaterial();
            frm.Nuevo();
            frm.ShowDialog();
            mATERIALBindingSource.DataSource = materialBL.GetFromMaterialByDescripcion(TxtDescripcion.Text);
            lblMensaje.Visible = false;
        }

        private void rucTextBox_TextChanged(object sender, EventArgs e)
        {
            if (bandera == false)
            {
                lblAyuda.Visible = false;
            }
            else
                lblAyuda.Visible = true;
        }

        private void rucTextBox_Leave(object sender, EventArgs e)
        {
            lblAyuda.Visible = false;
        }

        private void rucTextBox_Click(object sender, EventArgs e)
        {
            if (bandera == false)
            {
                lblAyuda.Visible = false;
            }
            else
                lblAyuda.Visible = true;
        }

        private void rucTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back)
                && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear))
            {
                e.Handled = true;
                return;
            }
        }

        private void productoDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.productoDataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
            {
                Agregarproducto();
            }
        }

        private void dETALLECOMPRAsDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            #region ModificarColumnas
            if (e.ColumnIndex == 0 || e.ColumnIndex == 2)
            {
                DETALLECOMPRA _detalle = dETALLECOMPRAsBindingSource.Current as DETALLECOMPRA;

                if (_detalle != null)
                {
                    if (_detalle.Cantidad >= 1)
                    {
                        CalcularTotal();
                    }
                    else
                    {
                        MessageBox.Show("La cantidad no puede ser menor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        _detalle.Cantidad = 1;
                    }

                    var material = materialBL.GetFromMaterialById(_detalle.materialId);

                    if ((_detalle.PrecioUnit > material.Costo || _detalle.PrecioUnit < material.Costo) && _detalle.PrecioUnit != 0)
                    {
                        MessageBox.Show("El Precio del Material es diferente al costo actual", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        frmMttoMaterial frm = new frmMttoMaterial();
                        frm.EditarOfCompra(_detalle.PrecioUnit, material.Id);
                        frm.ShowDialog();
                    }


                    var currentMaterial = materialBL.GetFromMaterialById(_detalle.materialId);
                    _detalle.PrecioUnit = currentMaterial.Costo;
                    CalcularTotal();
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }
            }

            #endregion
        }
        private void dETALLECOMPRAsDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //LoadUndMedida();
        }

        private void dETALLECOMPRAsDataGridView_CurrentCellChanged(object sender, EventArgs e)
        {
            #region UndMedida
            //LoadUndMedida();
            #endregion
        }

        //private void LoadUndMedida()
        //{
            //try
            //{
            //    var currentCompra = cOMPRABindingSource.Current as COMPRA;
                
            //    for (int count = 0; count < dETALLECOMPRAsDataGridView.Rows.Count; count++)
            //    {

            //        if (currentCompra != null)
            //        {
            //            MATERIAL a = dETALLECOMPRAsDataGridView.Rows[count].Cells[1].Value as MATERIAL;
            //            var und = undMedidaBL.GetFromUnidadMedidaById(a.unidadMedidaId);
            //            dETALLECOMPRAsDataGridView.Rows[count].Cells[2].Value = und.Descripcion.ToString();
            //        }
            //    }
            //}
            //catch (Exception)
            //{
            //    //MessageBox.Show("Error");
            //}
        //}

        private void dETALLECOMPRAsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dETALLECOMPRAsDataGridView.Columns[e.ColumnIndex].Name.Equals("Quitar"))
            {
                var _compra = cOMPRABindingSource.Current as COMPRA;
                var _detalle = dETALLECOMPRAsBindingSource.Current as DETALLECOMPRA;

                var rpt = MessageBox.Show(this, string.Format("¿Desea quitar el material del pedido?"), "Mensaje",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    if (_detalle.Id > 0)
                    {
                        var productoAlm = materialBL.GetFromMaterialById(_detalle.materialId);

                        if (_detalle.Cantidad < productoAlm.Stock)
                        {
                            detallecompraBL.RemoveDetalleCompraByMaterialIdAndCompraId(_detalle.materialId, _compra.Id);
                            dETALLECOMPRAsBindingSource.RemoveCurrent();
                        }
                        else
                        {
                            //MessageBox.Show("La cantidad del detalle excede el stock actual del producto","Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            MessageBox.Show("Ya se redujo el stock del material actual", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else dETALLECOMPRAsBindingSource.RemoveCurrent();

                    CalcularTotal();
                }
            }
        }

        private void dETALLECOMPRAsDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Asegúrese de ingresar valores correctos", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        

        





        //private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        //{
        //    if (e.KeyCode == Keys.Delete)
        //    {
        //        var _compra = cOMPRABindingSource.Current as COMPRA;
        //        var _detalle = dETALLECOMPRAsBindingSource.Current as DETALLECOMPRA;

        //        var rpt = MessageBox.Show(this,
        //                string.Format("¿Desea quitar el Material del pedido?"), "Mensaje",
        //                MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        //        if (rpt == DialogResult.Yes)
        //        {
        //            if (_detalle.Id > 0)
        //            {
        //                detallecompraBL.RemoveDetalleCompraByMaterialIdAndCompraId(_detalle.materialId, _compra.Id);
        //            }
        //            dETALLECOMPRAsBindingSource.RemoveCurrent();
        //            CalcularTotal();
        //        }
        //    }
        //}


    }
}
